home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).zip / Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).adf / ListPorts / ListPorts.S < prev    next >
Text File  |  1993-07-27  |  5KB  |  124 lines

  1. ;**************************** ListPorts *****************************
  2. ;*                                                                  *
  3. ;*  Listet die Public-Ports mit Namen, Adresse und Priorität auf.   *
  4. ;*  Dies sind die 'öffentlichen' Message-Ports, die in der Liste    *
  5. ;*  'PortList' miteinander verkettet sind. Außerdem wird noch der   *
  6. ;*  Zeiger auf den Empfänger-Task ausgegeben.                       *
  7. ;*  Aufruf vom CLI aus ohne Parameter.                              *
  8. ;*                                                                  *
  9. ;*                   © 1993 by Michael Gottwald                     *
  10. ;********************************************************************
  11.  
  12. Open     =  -30                      ; dos.library
  13. Write    =  -48                      ;  "     "
  14. OutPut   =  -60                      ;  "     "
  15. Exit     = -144                      ;  "     "
  16. OpenLib  = -408                      ; exec.library
  17. CloseLib = -414                      ;  "     "
  18.  
  19. ;----dos.library öffnen und Standard-Ausgabekanal ermitteln----------
  20.  
  21. run:     movem.l a0-a6/d0-d7,-(sp)   ; Alle Register retten
  22.          move.l  $4,a6
  23.          lea     DosName,a1
  24.          jsr     OpenLib(a6)
  25.          move.l  d0,DosBase
  26.          move.l  d0,a6
  27.          jsr     OutPut(a6)
  28.          move.l  d0,Handle
  29.          move.l  #Text,d2
  30.          move.l  #41,d3
  31.          bsr     print               ; Text ausgeben
  32.  
  33. ;----PortList-Liste durchsuchen und Namen ausgeben-------------------
  34.  
  35.          move.l  $4,a0               ; Adresse der ExecBase-Struktur
  36.          add.l   #392,a0             ; ab hier beginnt PortList...
  37.          move.l  a0,d0
  38.          add.l   #4,d0
  39.          cmp.l   (a0),d0             ; ist die Liste leer ?
  40.          beq     noPorts             ; ja, --> Ende
  41.  
  42.          move.l  (a0),a0             ; Listenkopf überlesen
  43. loop:    move.l  (a0),Node           ; Zeiger auf Nachfolger retten
  44.          beq     end                 ; = 0, --> Ende
  45.  
  46.          move.l  a0,Adress           ; Adresse der Struktur
  47.          move.b  9(a0),Priority      ; Priorität holen
  48.          move.l  16(a0),SigTask      ; Zeiger auf Empfänger-Task
  49.          move.l  10(a0),a1           ; Adresse des Namens
  50.          lea.l   Name,a2             ; Adresse des String-Puffers
  51.          move.l  #0,d3
  52. copy:    move.b  (a1)+,(a2)+         ; Zeichen kopieren
  53.          addq.l  #1,d3               ; Zeichen zählen
  54.          tst.b   -1(a2)              ; war letzter Code = 0 ?
  55.          bne     copy                ; nein, --> weiterkopieren
  56.          addq.l  #1,d3
  57.          move.l  #Name,d2            ; Text-Adresse...
  58.          bsr     print               ; Name ausgeben
  59.          
  60.          move.l  Node,a0             ; Zeiger auf nächsten Knoten
  61.          bra     loop                ; nächsten Namen holen
  62.  
  63. noPorts: move.l  #Text2,d2           ; Liste ist leer...
  64.          move.l  #33,d3
  65.          bsr     print               ; Meldung ausgeben
  66.          bra     end
  67.  
  68. ;----Text ausgeben---------------------------------------------------
  69.  
  70. print:   move.l  DosBase,a6
  71.          move.l  Handle,d1           ; Ausgabekanal (Shell-Fenster)
  72.          jsr     Write(a6)           ; Text ausgeben
  73.          rts
  74.  
  75. ;----Zurück ins CLI--------------------------------------------------
  76.  
  77. end:     movem.l (sp)+,a0-a6/d0-d7   ; Register zurückholen
  78.          move.l  DosBase,a6
  79.          clr.l   d1                  ; kein Return Code
  80.          jsr     Exit(a6)
  81.  
  82. ;----Dezimalzahl zwischen -128 und 127 ausgeben----------------------
  83.  
  84. prntDez: lea.l   Puffer,a0
  85.          btst    #7,d0               ; Zahl negativ ?
  86.          bne     positiv             ; nein, --> springen
  87.  
  88.          move.b  #"-",(a0)+          ; "-" voranstellen
  89.          and.b   #127,d0             ; Bit 7 löschen
  90.          subi.w  #256,d0             ; Absolutwert errechnen
  91.  
  92. positiv: cmp.b   #99,d0
  93.          bhi     xxx                 ; größer als 99, --> springen
  94.  
  95.          cmp.b   #9,d0
  96.          bhi     xx                  ; größer als 9, --> springen
  97.  
  98. prntVal: add.b   #"0",d0             ; ASCII-Code berechnen
  99.          move.b  d0,(a0)             ; Ziffer in Puffer schreiben
  100.          move.l  #Puffer,d2
  101.          move.l  #5,d3
  102.          bsr     print               ; Zahl ausgeben
  103.          rts
  104.  
  105. xxx:     move.b  #"1",(a0)+          ; Hunderter-Ziffer in Puffer
  106.          subi.b  #100,d0             ; 3. Stelle entfernen
  107. xx:
  108. ;----Datenbereich----------------------------------------------------
  109.   even
  110. DosName:  dc.b "dos.library",0
  111. DosBase:  dc.l 0
  112. Handle:   dc.l 0
  113. Node:     dc.l 0
  114. Priority: dc.l 0
  115. Adress:   dc.l 0
  116. SigTask:  dc.l 0
  117. Name:     blk.b 50,0                 ; Puffer für den aktuellen Namen
  118. Text:     dc.b "Folgende Message-Ports sind vorhanden:",13,10,10,0
  119. Text2:    dc.b "Keine Message-Ports vorhanden !",13,10
  120. PriText:  dc.b " , Priorität = ",0
  121. AdrText:  dc.b " , Adresse = ",0
  122. TskText:  dc.b " , Empfänger-Task = ",0
  123. Puffer:   blk.b 10,0                 ; Puffer für Dez- und Hex-Zahl
  124.